原文地址:用matlab实现B样条曲线作者:云梦之殇
三次b样条插值函数是
spline = spapi(knots,x,y)
spapi(k,x,y)
spapi({knork1,…,knorkm},{x1,…,xm},y)
spapi(…,‘noderiv’)
% B样条曲线生成程序
% 说明:给定8个控制顶点{(3 5),(2 4),(3 2),(6 1),(5 8),(10 6),(8 1),(6 0)}
%load c;x=800:25:1800;
%a(1,:)=x;a(2,:)=c;
a=[10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90;
20 16 26 26 26 26 24 24 24 22 22 16 28 26 26 26 24]; % 控制顶点数组;
%a=[4 3 2 3 6 5 10 8 6 4;6 5 4 2 1 8 6 1 0 -1];%增加两个控制顶点(4 6)(4 -1)从而使曲线通过原来的首末点;
plot(a(1,:),a(2,:),’:’); % 绘制控制多边形;
hold on; % 默认为hold off,此命令用来保留控制多边形的图形;
for i=1:38; % 由于4个顶点可以确定一条B样条,共有8个控制顶点,可确定5条B样条曲线;
%for i=1:7;
for u=0:0.001:1; % 参数u;
b0=1.0./6.(1-u).^3; % 基函数b0;
b1=1.0./6.(3.u.3-6.*u.2+4); % 基函数b1;
b2=1.0./6.(-3.*u.3+3.*u.2+3.*u+1); % 基函数b2;
b3=1.0./6.*u.^3; % 基函数b3;
x=b0.*a(1,i)+b1.*a(1,i+1)+b2.*a(1,i+2)+b3.*a(1,i+3); % 确定曲线的横坐标x;
y=b0.*a(2,i)+b1.*a(2,i+1)+b2.*a(2,i+2)+b3.*a(2,i+3); % 确定曲线的纵坐标y;
line(x,y); % 绘制曲线坐标点;
end
end
hold off;
转自:http://hi.baidu.com/liyaosong707/blog/item/a248da24183fcf34c99559ff.html
%==均匀三次B样条曲线插值=
%
%see also http://www.matlabsky.com
%
%定义变量:
%X:原始资料,d:控制顶点
%n:数据条数,k:B样条的次数
%
X=load(‘data.txt’);
n=length(X); %得数据维数;
%A:方程系数-----------------------------
A=zeros(n+2);
A(1,1)=1;A(1,2)=-2;A(1,3)=1;
A(n+2,n)=1;A(n+2,n+1)=-2;A(n+2,n+2)=1;
for i=2:(n+1)
A(i,i-1)=1;
A(i,i)=4;
A(i,i+1)=1;
end
%e:方程右边.得到的控制点首尾与插值数据相同.且与控制首末连线相切
e=[0,0];
e(n+2,:)=[0,0];
转自:http://www.matlabsky.com/thread-669-1-1.html
Matlab样条工具箱(Spline ToolBox)与曲线拟合
MATLAB 样条工具箱可以通过节点获得样本函数值,但不能根据x求y或z,也不能求得样本曲线方程。例如:
ctrlpoints=[
0 -1.2 -1.6 -1.4 -1 -0.5 -0.35 -0.6 -1.6
-0.2 -0.5 -1 -1.5 -2.2 -2.7 -3.2 -3.7 -4.2];
knots=[0 0 0 0 1 2 3 4 5 6 6 6 6];
x0=ctrlpoints(1,:);
y0=ctrlpoints(2,:);
plot(x0,y0,‘ro’);%画所有控制点
hold on;
sp = spmak(knots,ctrlpoints);%生成B样条函数
fnplt(sp,[knots(1),knots(13)]);%根据所有节点,画样条曲线图
%fnplt(sp,‘b*’);
%hold on;
dt=knots(1):1:knots(13);
p = fnval(sp,dt);%计算在给定点处的样条函数值
plot(p(1,:),p(2,:),’*g’);
dp1 = fnder(sp);%求样条函数的微分(即求导数)
dp = fnval(dp1,dt);
len = size(dt,2);
for i = 1:len
dir = dp(:,i);
scale = 1/sqrt(dir(1)2+dir(2)2);
dir = dir*scale;
plot([p(1,i),p(1,i)+dir(2)],[p(2,i),p(2,i)-dir(1)],‘r’);
end
axis equal
另外:
Matlab 样条工具箱(Spline ToolBox)
Matlab样条工具箱中的函数提供了样条的建立,操作,绘制等功能;
一. 样条函数的建立
第一步是建立一个样条函数,曲线或者曲面。这里的样条函数,根据前缀,分为4类:
cs* 三次样条
pp* 分段多项式样条,系数为t^n的系数
sp* B样条, 系数为基函数B_n^i(t)的系数
rp* 有理B样条
二. 样条操作
样条操作包括:函数操作:求值,算术运算,求导求积分等等
节点操作:主要是节点重数的调节,设定,修改等等
三. 简单示例
% step1: load ctrlpoints and knots
load data_example
% step 2: create the spline
sp = spmak(knots,ctrlpoints’);
fnplt(sp,[knots(5),knots(42)]);
% step 3: get points on the curve
dt = knots(5):3:knots(42);
p = fnval(sp,dt);
plot(p(1,:),p(2,:),’.g’)
% step 4: get dir draw normals
dp1 = fnder(sp);
dp = fnval(dp1,dt);
len = size(dt,2);
for i = 1:len
dir = dp(:,i);
scale = 1/sqrt(dir(1)2+dir(2)2);
dir = dir*scale;
plot([p(1,i),p(1,i)+dir(2)],[p(2,i),p(2,i)-dir(1)],‘r’);
end
附:样条工具箱函数
-
三次样条函数
csapi 插值生成三次样条函数
csape 生成给定约束条件下的三次样条函数
csaps 平滑生成三次样条函数
cscvn 生成一条内插参数的三次样条曲线
getcurve 动态生成三次样条曲线 -
分段多项式样条函数
ppmak 生成分段多项式样条函数
ppual 计算在给定点处的分段多项式样条函数值 -
B样条函数
spmak 生成B样条函数
spcrv 生成均匀划分的B样条函数
spapi 插值生成B样条函数
spap2 用最小二乘法拟合生成B样条函数
spaps 对生成的B样条曲线进行光滑处理
spcol 生成B样条函数的配置矩阵 -
有理样条函数
rpmak 生成有理样条函数
rsmak 生成有理样条函数 -
样条操作函数
fnval 计算在给定点处的样条函数值
fmbrk 返回样条函数的某一部分(如断点或系数等)
fncmb 对样条函数进行算术运算
fn2fm 把一种形式的样条函数转化成另一种形式的样条函数
fnder 求样条函数的微分(即求导数)
fndir 求样条函数的方向导数
fnint 求样条函数的积分
fnjmp 在间断点处求函数值
fnplt 画样条曲线图
fnrfn 在样条曲线中插入断点。
fntlr 生成tarylor系数或taylor多项式 -
样条曲线端点和节点处理函数
augknt 在已知节点数组中添加一个或多个节点
aveknt 求出节点数组元素的平均值
brk2knt 增加节点数组中节点的重次
knt2brk 从节点数组中求得节点及其重次
knt2mlt 从节点数组中求得节点及其重次
sorted 求出节点数组的元素在另一节点数组中属于第几个分量
aptknt 求出用于生成样条曲线的节点数组
newknt 对分段多项式样条函数进行重分布
optknt 求出用于内插的最优节点数组
chbpnt 求出用于生成样条曲线的合适节点数组
转自:http://blog.csdn.net/wuzoujing/article/details/4943251
基于Matlab的双三次有理B样条曲面
xc=[1,1,2,1;4,4,4,4;7,6,7,8;10,9,10,9;];
yc=[1,3,6,9;0,3,6,10;0,3,6,9;1,4,7,10;];
zc=[3,5,5,2;4,6,7,4;4,7,6,5;2,4,5,4];%给出控制点坐标
%下面计算基函数
i=0; %i表示点的标号
for u=0:0.01:1
for v=0:0.01:1
i=i+1;
a1=1/6*(1-3u+3u.u-u.u.u);
a2=1/6(4-6u.u+3u.u.u);
a3=1/6(1+3u+3u.u-3u.u.u);
a4=1/6u.u.u;
b1=1/6(1-3v+3v.v-v.v.v);
b2=1/6(4-6v.v+3v.v.v);
b3=1/6(1+3v+3v.v-3v.*v.v);
b4=1/6v.*v.*v;
xq(i)=[a1 a2 a3 a4]xc[b1;b2;b3;b4];%曲面上点的坐标赋值
yq(i)=[a1 a2 a3 a4]yc[b1;b2;b3;b4];
zq(i)=[a1 a2 a3 a4]zc[b1;b2;b3;b4];
end
end
mesh(xc,yc,zc);%控制点的网格
hidden;
hold on;
plot3(xq,yq,zq);%生成曲面
[转载]用matlab实现B样条曲线
b1=[2,2];b2=[3,5];b3=[5,6];b4=[7,3];%四个型值点的横纵坐标值 可以自定
plot([b1(1),b2(1),b3(1),b4(1)],[b1(2),b2(2),b3(2),b4(2)],‘o’);%画出型值点
hold on;
N=[5 1 0 0;1 4 1 0;0 1 4 1;0 0 1 5];
P=N(6*([b1;b2;b3;b4]));%P是二维数组 存放控制点 求出P
xc1=P(1); %对应6个控制点
xc2=P(2);
xc3=P(3);
xc4=P(4);
yc1=P(5);
yc2=P(6);
yc3=P(7);
yc4=P(8);
plot([xc1,xc2,xc3,xc4],[yc1,yc2,yc3,yc4],’’)%画出控制点
hold on;
plot([xc1,xc2,xc3,xc4],[yc1,yc2,yc3,yc4])%连接控制点
hold on;
u=0:0.01:1;
N1=1/6(1-3u+3u.u-u.u.u);%基函数
N2=1/6(4-6u.u+3u.u.u);
N3=1/6(1+3u+3u.u-3u.*u.u);
N4=1/6u.*u.*u;
xp=xc1.*N1+xc1.*N2+xc2.*N3+xc3.*N4;
yp=yc1.*N1+yc1.*N2+yc2.*N3+yc3.*N4;
plot(xp,yp);%正算第一段B样条
hold on;
xp=xc1.*N1+xc2.*N2+xc3.*N3+xc4.*N4;
yp=yc1.*N1+yc2.*N2+yc3.*N3+yc4.*N4;
plot(xp,yp);%正算第二段B样条
hold on;
xp=xc2.*N1+xc3.*N2+xc4.*N3+xc4.*N4;
yp=yc2.*N1+yc3.*N2+yc4.*N3+yc4.*N4;
plot(xp,yp);%正算第三段B样条
hold on;
http://hi.baidu.com/aillieo/blog/item/e001793ff61172e154e72349.html